/*
 * @lc app=leetcode.cn id=697 lang=cpp
 *
 * [697] 数组的度
 *
 * https://leetcode-cn.com/problems/degree-of-an-array/description/
 *
 * algorithms
 * Easy (60.25%)
 * Likes:    403
 * Dislikes: 0
 * Total Accepted:    73.5K
 * Total Submissions: 122.1K
 * Testcase Example:  '[1,2,2,3,1]'
 *
 * 给定一个非空且只包含非负数的整数数组 nums，数组的 度 的定义是指数组里任一元素出现频数的最大值。
 *
 * 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组，返回其长度。
 *
 *
 *
 * 示例 1：
 *
 *
 * 输入：nums = [1,2,2,3,1]
 * 输出：2
 * 解释：
 * 输入数组的度是 2 ，因为元素 1 和 2 的出现频数最大，均为 2 。
 * 连续子数组里面拥有相同度的有如下所示：
 * [1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
 * 最短连续子数组 [2, 2] 的长度为 2 ，所以返回 2 。
 *
 *
 * 示例 2：
 *
 *
 * 输入：nums = [1,2,2,3,1,4,2]
 * 输出：6
 * 解释：
 * 数组的度是 3 ，因为元素 2 重复出现 3 次。
 * 所以 [2,2,3,1,4,2] 是最短子数组，因此返回 6 。
 *
 *
 *
 *
 * 提示：
 *
 *
 * nums.length 在 1 到 50,000 范围内。
 * nums[i] 是一个在 0 到 49,999 范围内的整数。
 *
 *
 */

// @lc code=start
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
/* class Solution {
public:
    int findShortestSubArray(vector<int>& nums) {
        // 分别为元素、下标
        multimap<int,int> hash;
        set<int> hash_set;
        int ans=0;
        int degree=0;
        for(int i=0;i<nums.size();++i){
            hash.insert({nums[i],i});
            hash_set.insert(nums[i]);
        }
        for(auto element:hash_set){
            int cnt=hash.count(element);
            if(cnt>degree){
                degree=cnt;
                auto beg=hash.lower_bound(element);
                auto end=hash.upper_bound(element);
                end--;
                ans=end->second-beg->second+1;
            }
            else if(cnt==degree){
                auto beg=hash.lower_bound(element);
                auto end=hash.upper_bound(element);
                end--;
                ans=min(end->second-beg->second+1,ans);
            }
        }
        return ans;
    }
}; */

class Solution {
public:
    int findShortestSubArray(vector<int> &nums) {
        int n = nums.size();
        if (n == 0) {
            return 0;
        }
        int maximum = 0;
        int ans = INT_MAX;
        unordered_map<int, vector<int>> hash;
        for (int i = 0; i < n; ++i) {
            if (hash.find(nums[i]) != hash.end()) {
                hash[nums[i]][0]++;
                hash[nums[i]][2] = i;
            }
            else {
                hash.insert({nums[i], vector<int>{1, i, i}});
            }
            maximum = max(maximum, hash[nums[i]][0]);
        }
        for (auto item : hash) {
            if (item.second[0] == maximum) {
                ans = min(ans, item.second[2] - item.second[1] + 1);
            }
        }
        return ans;
    }
};
// @lc code=end
